'''
Created on 24/05/2013

@author: cristian
'''

from flask import Flask, session, redirect, url_for, escape, request, Response
from pm import app
from pm.database import db
from . import jsonifiedview
import datetime
import simplejson
from pm.models.SolicitudCambio import SolicitudCambio
from pm.models.VotacionSolicitudCambio import VotacionSolicitudCambio
from pm.models.MiembrosComite import  MiembrosComite    
from pm.models.Items import Items
from pm.views.RelacionesViews import calcularImpactoSolicitud
from pm.views.RelacionesViews import calcularImpactoMonetarioSolicitud
from .LoginViews import islogged
from pm.models.UsuariosRoles import UsuariosRoles
from pm.models.UsuariosRolesFases import UsuariosRolesFases
from pm.models.Usuarios import Usuarios
from pm.models.LineaBase import LineaBase
from pm.models.Roles import Roles
from pm.models.Solicitud_Items import Solicitud_Items
from pm.models.VotacionSolicitudCambio import VotacionSolicitudCambio
from pm.views import ensureParams
from sqlalchemy.exc import IntegrityError
from sqlalchemy import or_
from pm.models.Fases import Fases
import json
from StringIO import StringIO
from pm.views.MetodosSolicitudCambioViews import cambiarEstado
from pm.models.Proyectos import Proyectos





@app.route('/solicitudcambio/busqueda', methods=['GET', 'POST']) 
@jsonifiedview
def busquedaSolicitudDeCambio():
    '''
    Lista de solitudes existentes en el sistema
    '''
    params = {'GET':request.args, 'POST':request.form}[request.method]
      
    solicitud = SolicitudCambio.query
    solicitud = SolicitudCambio.filter(SolicitudCambio.user_name.like('%' + params['user_name'] + '%')) if 'user_name' in params else solicitud
    solicitud = SolicitudCambio.filter(SolicitudCambio.observacion.like('%' + params['observacion'] + '%')) if 'observacion' in params else solicitud 
    solicitud = SolicitudCambio.filter(SolicitudCambio.estado.like('%' + params['estado'] + '%')) if 'estado' in params else solicitud
    solicitud = SolicitudCambio.filter(SolicitudCambio.activo.like('%' + params['activo'] + '%')) if 'activo' in params else solicitud 
    solicitud = SolicitudCambio.filter(SolicitudCambio.nombre_items.like('%' + params['nombre_items'] + '%')) if 'nombre_items' in params else solicitud
    solicitud = SolicitudCambio.filter(SolicitudCambio.contador_votacion.like('%' + params['contador_votacion'] + '%')) if 'contador_votacion' in params else solicitud 
    return solicitud.order_by(solicitud.id_solicitud_cambio).all()

@app.route('/solicitudcambio/crear', methods=['GET', 'POST']) 
@jsonifiedview
def crearSolicitudDeCambio():
    '''
    Metodo que crea una solicitud de Cambio
    '''
    params = {'GET':request.args, 'POST':request.form}[request.method]
    response = {}
    if not ensureParams(params, ['id_usuario', 'observacion','id_items']): 
        response = {"success" : False , "msg" : "Parametros Insuficientes!!"} 
        return response  
    
    try:
        
        id_usuario= int(str(params['id_usuario']))
        observacion= str(params['observacion'])
        id_items= simplejson.loads(params['id_items'])
        
        impacto_suma_total=0
        impacto_monetario_total=0
        descripcion_items=''
        descripcion_lb = ''
        
        now = datetime.datetime.now()
        usuario= Usuarios.query.filter(Usuarios.id_usuario==id_usuario).one()
        
        for id_item in id_items:
            item= Items.query.filter(Items.id_item== id_item).one()
            
            fasesProyecto=Fases.query.filter(Fases.id_fase==item.id_fase).one()
            
            proyectoPrueba=Proyectos.query.filter(Proyectos.id_proyecto==fasesProyecto.id_proyecto).one()
            
            if proyectoPrueba.estado==3:
                response = {"success" : False , "msg" : "NO se pueden realizar mas Solicitudes!!\n El proyecto ha finalizado!!"}
                return response
            
            descripcion_items= descripcion_items + item.nombre + ';'
            lineaBase = LineaBase.query.filter(LineaBase.id_linea_base == item.id_linea_base).one()
            descripcion_lb = descripcion_lb + str(lineaBase.numero) +';'
            
            try:
                
                impacto_total= int(str(calcularImpactoSolicitud(id_item)))
                impacto_monetario= int(str( calcularImpactoMonetarioSolicitud(id_item)))
                
                impacto_suma_total=impacto_suma_total + impacto_total
                impacto_monetario_total= impacto_monetario_total + impacto_monetario
                
              
            except Exception, e :
                response = {"success" : False , "msg" : "Ups! Hubo un error al intentar calcular el impacto del item. Intentelo mas tarde!!"}
                return response 
        
        for id_item in id_items:  
            verificar_solicitud= Solicitud_Items.query.filter(Solicitud_Items.id_item==id_item).all()
            for vs in verificar_solicitud:
                if vs.activo==True:
                    response ={"success" : False , "msg" : "Ups.!! Este item ya cuenta con una Solitud de Cambio ,favor, intentelo mas tarde!!"}
                    return response
                
        try:        
            solicitudCambio= SolicitudCambio(id_usuario,usuario.user_name,observacion, impacto_suma_total,impacto_monetario_total,'Pendiente de Envio',True,descripcion_items,0,0,0,now,False,descripcion_lb)
            db.session.add(solicitudCambio)
            db.session.commit()
        except Exception, e :
            response = {"success" : False , "msg" : "Ups! Hubo un error al intentar crear la solicitud. Intentelo mas tarde!!" + str(e)}
            return response
        
        try:
            for id_item in id_items:
                solicitud_item= Solicitud_Items(solicitudCambio.id_solicitud_cambio,id_item,True)
                db.session.add(solicitud_item)
                db.session.commit()
        except Exception, e :
            response = {"success" : False , "msg" : "Ups! Ups! Hubo un error al intentar crear la solicitud"}
            return response
        
        response ={"success" : True , "msg" : "Solicitud Creada Exitosamente!!"}
        return response
    except Exception, e:
        
        db.session.rollback()
        response ={"success" : False , "msg" : "Ups!! Hubo un error al intentar crear la solicitud de Cambio..."}
        return response

    
@app.route('/solicitudcambio/listarsolicitudparausuario', methods=['GET', 'POST']) 
@jsonifiedview
def listarSolicitudDeCambioParaUsuario():   
    '''
        Metodo que retorna la solicitud que pertenecen a ese usuario
    '''
    params = {'GET':request.args, 'POST':request.form}[request.method]
    response = {}
    if not ensureParams(params, ['id_usuario','id_proyecto']): 
        response = {"success" : False , "msg" : "Parametros Insuficientes!!"} 
        return response  
    try:
        id_usuario= int(str(params['id_usuario']))
        id_proyecto= int(str(params['id_proyecto']))
        
        fase= Fases.query.filter(Fases.id_proyecto==id_proyecto).all()
        listaSolicitud=[]
                                    
        """ Si el usuario No es miembro cargamos las solicitudes pertenecientes del mismo en ese proyecto"""
        solicitud = SolicitudCambio.query.filter(SolicitudCambio.id_usuario==id_usuario)
        solicitud = solicitud.filter(SolicitudCambio.user_name.like('%' + params['user_name'] + '%')) if 'user_name' in params else solicitud
        solicitud = solicitud.filter(SolicitudCambio.observacion.like('%' + params['observacion'] + '%')) if 'observacion' in params else solicitud 
        solicitud = solicitud.filter(SolicitudCambio.estado.like('%' + params['estado'] + '%')) if 'estado' in params else solicitud
        solicitud = solicitud.filter(SolicitudCambio.activo.like('%' + params['activo'] + '%')) if 'activo' in params else solicitud 
        solicitud = solicitud.filter(SolicitudCambio.nombre_items.like('%' + params['nombre_items'] + '%')) if 'nombre_items' in params else solicitud
        solicitud = solicitud.filter(SolicitudCambio.contador_votacion.like('%' + params['contador_votacion'] + '%')) if 'contador_votacion' in params else solicitud 
        solicitud = solicitud.all()
        for f in fase:
            item=Items.query.filter(Items.id_fase==f.id_fase).all()
            for i in item:
                for sc in solicitud:
                    solicitud_item= Solicitud_Items.query.filter(Solicitud_Items.id_solicitud_cambio==sc.id_solicitud_cambio).filter(Solicitud_Items.activo==True).all()
                    for si in solicitud_item:
                        if i.id_item == si.id_item and sc.id_solicitud_cambio==si.id_solicitud_cambio:
                            if sc not in listaSolicitud:
                                listaSolicitud.append(sc)                 
        response ={"success" : True , "Lista de Solicitudes" : listaSolicitud}
        return listaSolicitud
    except Exception, e:
        print e
        response ={"success" : False , "msg" : "Ups!! Hubo un error al intentar obtener la lista de solicitudes de Cambio...", "msg2":e}
        return response

@app.route('/solicitudcambio/listarsolicitudparacomite', methods=['GET', 'POST']) 
@jsonifiedview
def listarSolicitudDeCambioParaComite():   
  
    params = {'GET':request.args, 'POST':request.form}[request.method]
    response = {}
    if not ensureParams(params, ['id_usuario','id_proyecto']): 
        response = {"success" : False , "msg" : "Parametros Insuficientes!!"} 
        return response  
    try:
        id_usuario= int(str(params['id_usuario']))
        id_proyecto= int(str(params['id_proyecto']))
        
        fase= Fases.query.filter(Fases.id_proyecto==id_proyecto).all()
        listaSolicitud=[]
        solicitudCambioMiembros= SolicitudCambio.query.all()
        
        esMiembro=False
        miembrosComite= MiembrosComite.query.filter(MiembrosComite.id_proyecto==id_proyecto).all()
        """Si es miembro seteamos a True el boolean sino mant"""
        for mc in miembrosComite:
            if mc.id_usuario==id_usuario:
                esMiembro=True
        """Si el usuario es miembro cargamos todas las solicitudes pertenecientes a ese proyecto"""       
        if esMiembro==True: 
            solicitud = SolicitudCambio.query
            solicitud = solicitud.filter(SolicitudCambio.user_name.like('%' + params['user_name'] + '%')) if 'user_name' in params else solicitud
            solicitud = solicitud.filter(SolicitudCambio.observacion.like('%' + params['observacion'] + '%')) if 'observacion' in params else solicitud 
            solicitud = solicitud.filter(SolicitudCambio.estado.like('%' + params['estado'] + '%')) if 'estado' in params else solicitud
            solicitud = solicitud.filter(SolicitudCambio.activo.like('%' + params['activo'] + '%')) if 'activo' in params else solicitud 
            solicitud = solicitud.filter(SolicitudCambio.nombre_items.like('%' + params['nombre_items'] + '%')) if 'nombre_items' in params else solicitud
            solicitud = solicitud.filter(SolicitudCambio.contador_votacion.like('%' + params['contador_votacion'] + '%')) if 'contador_votacion' in params else solicitud 
            solicitud = solicitud.all()
            for f in fase:
                item= Items.query.filter(Items.id_fase==f.id_fase).all()
                for i in item:
                    for scm in solicitud:
                        solicitud_item= Solicitud_Items.query.filter(Solicitud_Items.id_solicitud_cambio==scm.id_solicitud_cambio).all()
                        for si in solicitud_item:
                            if i.id_item == si.id_item and si.activo== True:
                                votacion = VotacionSolicitudCambio.query.filter(VotacionSolicitudCambio.id_usuario==id_usuario).filter(VotacionSolicitudCambio.id_solicitud_cambio==scm.id_solicitud_cambio).one()
                                if votacion.voto== False:
                                    if scm not in listaSolicitud:
                                        listaSolicitud.append(scm)
            response ={"success" : True , "Lista de Solicitudes" : listaSolicitud}
            return listaSolicitud
        else:
            return listaSolicitud
    except Exception, e:
        print e
        response ={"success" : False , "msg" : "Ups!! Hubo un error al intentar obtener la lista de solicitudes de Cambio Enviados..." + str(e)}
        return response

@app.route('/solicitudcambio/enviarsolicitud', methods=['GET', 'POST']) 
@jsonifiedview
def enviarSolicitudDeCambioAComite():   
  
    params = {'GET':request.args, 'POST':request.form}[request.method]
    response = {}
    if not ensureParams(params, ['id_solicitud_cambio','id_proyecto']): 
        response = {"success" : False , "msg" : "Parametros Insuficientes!!"} 
        return response  
    try:
        
        id_solicitud_cambio= int(str(params['id_solicitud_cambio']))
        id_proyecto= int(str(params['id_proyecto']))
        solicitudCambioAux= SolicitudCambio.query.filter(SolicitudCambio.id_solicitud_cambio==id_solicitud_cambio).one()
        if solicitudCambioAux.estado=="Pendiente de Envio":
            solicitudCambio= SolicitudCambio.query.filter(SolicitudCambio.id_solicitud_cambio==id_solicitud_cambio).update({'estado':'Enviado'})
            db.session.commit()
            miembrosComite= MiembrosComite.query.filter(MiembrosComite.id_proyecto==id_proyecto).all()
            try:
                for mc in miembrosComite:
                    votacion= VotacionSolicitudCambio(id_solicitud_cambio,id_proyecto,mc.id_usuario,False)
                    db.session.add(votacion)
                    db.session.commit()
            except Exception, e:
                db.session.rollback()
                response = {"success" : False , "msg" : "Ups... No se ha podido enviar la Solicitud por algun error inesperado!!"}
                return response   
    
            response ={"success" : True , "msg" : "Solicitud Enviada Exitosamente!!"}
            return response
        else:
            response ={"success" : True , "msg" : "La solicitud ya ha sido enviada"}
            return response
    except Exception, e:
        db.session.rollback()
        response = {"success" : False , "msg" : "Ups... No se ha podido enviar la Solicitud, intentelo mas tarde!!"}
        return response 
@app.route('/solicitudcambio/votarsolicituddecambio', methods=['GET', 'POST']) 
@jsonifiedview
def votarSolicitudDeCambio():   
  
    params = {'GET':request.args, 'POST':request.form}[request.method]
    response = {}
    if not ensureParams(params, ['id_solicitud_cambio','id_proyecto','id_usuario','voto']): 
        response = {"success" : False , "msg" : "Parametros Insuficientes!!"} 
        return response  
    try:
        id_solicitud_cambio= int(str(params['id_solicitud_cambio']))
        id_proyecto= int(str(params['id_proyecto']))
        id_usuario= int(str(params['id_usuario']))
        voto=params['voto']
        
        
        scVotos= SolicitudCambio.query.filter(SolicitudCambio.id_solicitud_cambio==id_solicitud_cambio).one()
        if voto=="true":
            solicitudCambio= SolicitudCambio.query.filter(SolicitudCambio.id_solicitud_cambio==id_solicitud_cambio).update({'contador_votacion':scVotos.contador_votacion + 1,'voto_favor':scVotos.voto_favor+1})
            db.session.commit()
        if voto=="false":
            solicitudCambio= SolicitudCambio.query.filter(SolicitudCambio.id_solicitud_cambio==id_solicitud_cambio).update({'contador_votacion':scVotos.contador_votacion + 1,'voto_contra':scVotos.voto_contra+1})
            db.session.commit()
        
        try:
            votacion= VotacionSolicitudCambio.query.filter(VotacionSolicitudCambio.id_proyecto==id_proyecto).filter(VotacionSolicitudCambio.id_solicitud_cambio==id_solicitud_cambio).filter(VotacionSolicitudCambio.id_usuario==id_usuario).update({'voto':True})
            db.session.commit()
        except Exception, e:
            db.session.rollback()
            response = {"success" : False , "msg" : "Ups... No se ha podido votar por algun error inesperado!!"}
            return response  
        
        scVotos= SolicitudCambio.query.filter(SolicitudCambio.id_solicitud_cambio==id_solicitud_cambio).one()
        contadorMiembrosComite= MiembrosComite.query.filter(MiembrosComite.id_proyecto==id_proyecto).count()
        
        if(scVotos.contador_votacion==contadorMiembrosComite):
            contadorFavor= scVotos.voto_favor
             
            if contadorFavor>scVotos.voto_contra:
                try:
                    solicitudCambio= SolicitudCambio.query.filter(SolicitudCambio.id_solicitud_cambio==id_solicitud_cambio).update({'estado':'Solicitud Aprobada'})
                    db.session.commit()
                except Exception, e:
                    db.session.rollback()
                    response = {"success" : False , "msg" : "Ups...No se ha podido votar por algun error inesperado!!"}
                    return response 
            
            else:
                try:
                    solicitudCambio= SolicitudCambio.query.filter(SolicitudCambio.id_solicitud_cambio==id_solicitud_cambio).update({'estado':'Solicitud Desaprobada'})
                    db.session.commit()
                except Exception, e:
                    db.session.rollback()
                    response = {"success" : False , "msg" : "Ups... No se ha podido votar por algun error inesperado!!"}
                    return response 
        solicitudCambio= SolicitudCambio.query.filter(SolicitudCambio.id_solicitud_cambio==id_solicitud_cambio).one()       
        if((solicitudCambio.contador_votacion)==1):
            try:
                solicitudCambio= SolicitudCambio.query.filter(SolicitudCambio.id_solicitud_cambio==id_solicitud_cambio).update({'estado':'En Votacion'})
                db.session.commit()
            except Exception, e:
                    db.session.rollback()
                    response = {"success" : False , "msg" : "Ups... No se ha podido votar por algun error inesperado!!"}
                    return response 
        response ={"success" : True , "msg" : "Votacion realizada exitosamente!!\n Compruebe otras solicitudes si asi las hubiere!!"}
        return response
    except Exception, e:
        db.session.rollback()
        response = {"success" : False , "msg" : "Ups... No se ha podido realizar la votacion por algun error inesperado, intentelo mas tarde!!"}
        return response 

@app.route('/solicitudcambio/listaritemsposiblesdistinct', methods=['GET', 'POST']) 
@jsonifiedview
def listarItemsSolicitudDeCambioDistinct():
    params = {'GET':request.args, 'POST':request.form}[request.method]
    response = {}
    if not ensureParams(params, ['id_proyecto','id_usuario']): 
        response = {"success" : False , "msg" : "Parametros Insuficientes!!"} 
        return response  
    try:
        id_proyecto= int(str(params['id_proyecto']))
        id_usuario= int(str(params['id_usuario']))
        fases= Fases.query.filter(Fases.id_proyecto==id_proyecto).all()
        usuarioRolesFases= UsuariosRolesFases.query.filter(UsuariosRolesFases.id_proyecto==id_proyecto).filter(UsuariosRolesFases.activo==True).all()
        usuarioRoles= UsuariosRoles.query.filter(UsuariosRoles.id_usuario==id_usuario).all()
        listaFases=[]
        for ur in usuarioRoles:
            for urf in usuarioRolesFases:
                for f in fases:
                    rol = Roles.query.filter(Roles.id_rol==ur.id_rol).one()
                    if(rol.nombre=='LIDER_PROYECTO'):
                        if (ur.id_usuario_rol == urf.id_usuario_rol and f.activo==True):
                            if f not in listaFases:
                                listaFases.append(f)
                    else:
                        if (ur.id_usuario_rol == urf.id_usuario_rol and f.activo==True and urf.id_fase==f.id_fase):
                            if f not in listaFases:
                                listaFases.append(f)
        listaItems=[]
        for lf in listaFases:
            items= Items.query.filter(Items.id_fase==lf.id_fase).all()
            for i in items:
                if i.id_linea_base != None:
                    listaItems.append(i)
        itemsSolicitud= SolicitudCambio.query.all()
        for li in listaItems:
            for its in itemsSolicitud:
                solicitud_items= Solicitud_Items.query.filter(Solicitud_Items.id_solicitud_cambio==its.id_solicitud_cambio).all()
                for si in solicitud_items:
                    if si.id_item==li.id_item and si.activo==True:
                        listaItems.remove(li)
        response = {"success" : True , "lista" : listaItems} 
        return listaItems  
    except Exception, e:
        print e
        response = {"success" : False , "msg" : "Ups... No se pudo traer la  lista de items!!"}
        return response 
    
@app.route('/solicitudcambio/ejecutar', methods=['GET', 'POST']) 
@jsonifiedview
def ejecutarSolicitudCambio():
    params = {'GET':request.args, 'POST':request.form}[request.method]
    response = {}
    if not ensureParams(params, ['id_solicitud_cambio']): 
        response = {"success" : False , "msg" : "Parametros Insuficientes!!"} 
        return response  
    
    
    try:
       
        id_solicitud_cambio = int(str(params['id_solicitud_cambio']))
        
        solicitudCamb = SolicitudCambio.query.filter(SolicitudCambio.id_solicitud_cambio==id_solicitud_cambio).one()
        if solicitudCamb.estado !="Solicitud Aprobada":
            response = {"success" : True , "msg" : "LA solicitud no ha sido aprobada para su ejecucion"}
            return response 
        
        '''Se procesa el item actual, se elimina o se rompe la linea base actual
             Se debe poner a estado 4= revision-Desbloqueo  el item actual y los demas(adelante) a estado 5= revision-Bloq
             estado de la linea base actual = abierto y los demas items asociados a 3=revision
             1=cerrado
             2= abierto
             3= revision-Bloq
             
             
             Se debe obtener los items asociados en esta fase que estan en la misma lb y por cada linea base 
             cambiarEstadosHaciaAdelante
        '''
        try:
            solicitudCambio = SolicitudCambio.query.filter(SolicitudCambio.id_solicitud_cambio==id_solicitud_cambio).update({'ejecutado':True})
            db.session.commit()
        except Exception, e:
            response = {"success" : False , "msg" : str(e)}
            return response 
        
        solicitud_items= Solicitud_Items.query.filter(Solicitud_Items.id_solicitud_cambio==id_solicitud_cambio).filter(Solicitud_Items.activo==True).all()
        
        for si in solicitud_items:
            
            itemActualAux= Items.query.filter(Items.id_item==si.id_item).one()
            faseLB = Fases.query.filter(Fases.id_fase==itemActualAux.id_fase).one()
            faseDisminuirLB = Fases.query.filter(Fases.id_fase==itemActualAux.id_fase).update({'cantidad_lb':faseLB.cantidad_lb-1, 'estado':2})
            db.session.commit()
            
            lb = LineaBase.query.filter(LineaBase.id_linea_base==itemActualAux.id_linea_base).update({'estado':2})
            db.session.commit()
            
            idLineaBaseActual = itemActualAux.id_linea_base
            itemActual= Items.query.filter(Items.id_item==si.id_item).update({'estado':4, 'id_linea_base':None})
            db.session.commit()
            
            itemsLB= Items.query.filter(Items.id_linea_base==idLineaBaseActual).all()
            for ilb in itemsLB:
                if ilb.estado!=4:
                    items= Items.query.filter(Items.id_item==ilb.id_item).update({'estado':5, 'id_linea_base':None})
                    db.session.commit()
            try:        
                for ilb in itemsLB:
                    cambiarEstado(ilb.id_item)
            except Exception, e:
                print e
                response = {"success" : False , "msg" : "Ups... No se ha podido romper las lineas bases siguientes por alguna razon!!"}
                return response 
            
        response = {"success" : True , "msg" : "Realizado exitosamente!!"}
        return response 
                    
    except Exception, e:
        db.session.rollback()
        response = {"success" : False , "msg" :str(e)+'error'}
        return response 
    
@app.route('/solicitudcambio/eliminar', methods=['GET', 'POST']) 
@jsonifiedview
def eliminarSolicitudCambio():
    params = {'GET':request.args, 'POST':request.form}[request.method]
    response = {}
    if not ensureParams(params, ['id_solicitud_cambio']): 
        response = {"success" : False , "msg" : "Parametros Insuficientes!!"} 
        return response  
    try:
        id_solicitud_cambio = int(str(params['id_solicitud_cambio']))
        
        solicitud= SolicitudCambio.query.filter(SolicitudCambio.id_solicitud_cambio==id_solicitud_cambio).one()
        if solicitud.estado != "Pendiente de Envio":
            response = {"success" : False , "msg" : "La solicitud ya ha sido enviada y no puede ser eliminada!!"}
            return response    
        
        solicitud_item= Solicitud_Items.query.filter(Solicitud_Items.id_solicitud_cambio==id_solicitud_cambio).filter(Solicitud_Items.activo==True).all()
        
        for si in solicitud_item:
            db.session.delete(si)
            db.session.commit()
            
        
        solicitudCambio= SolicitudCambio.query.filter(SolicitudCambio.id_solicitud_cambio==id_solicitud_cambio).one()
        db.session.delete(solicitudCambio)
        db.session.commit()
        
        response = {"success" : True , "msg" : "La solicitud ha sido eliminada exitosamente!!"}
        return response
    except Exception, e:
        db.session.rollback()
        response = {"success" : False , "msg" : "Ups... No se ha podido Eliminar la Solicitud de Cambio, intentelo mas tarde!!"+str(e)}
        return response       

@app.route('/solicitudcambio/listaritemsparamodificacion', methods=['GET', 'POST']) 
@jsonifiedview
def listarItemsSolicitudDeCambioModificacion():
    params = {'GET':request.args, 'POST':request.form}[request.method]
    response = {}
    if not ensureParams(params, ['id_proyecto','id_usuario','id_solicitud_cambio']): 
        response = {"success" : False , "msg" : "Parametros Insuficientes!!"} 
        return response  
    try:
        id_proyecto= int(str(params['id_proyecto']))
        id_usuario= int(str(params['id_usuario']))
        id_solicitud_cambio = int(str(params['id_solicitud_cambio']))
        
        fases= Fases.query.filter(Fases.id_proyecto==id_proyecto).all()
        usuarioRolesFases= UsuariosRolesFases.query.filter(UsuariosRolesFases.id_proyecto==id_proyecto).filter(UsuariosRolesFases.activo==True).all()
        usuarioRoles= UsuariosRoles.query.filter(UsuariosRoles.id_usuario==id_usuario).all()
        listaFases=[]
        for ur in usuarioRoles:
            for urf in usuarioRolesFases:
                for f in fases:
                    rol = Roles.query.filter(Roles.id_rol==ur.id_rol).one()
                    if(rol.nombre=='LIDER_PROYECTO'):
                        if (ur.id_usuario_rol == urf.id_usuario_rol and f.activo==True):
                            if f not in listaFases:
                                listaFases.append(f)
                    else:
                        if (ur.id_usuario_rol == urf.id_usuario_rol and f.activo==True and urf.id_fase==f.id_fase):
                            if f not in listaFases:
                                listaFases.append(f)
        listaItems=[]
        for lf in listaFases:
            items= Items.query.filter(Items.id_fase==lf.id_fase).all()
            for i in items:
                if i.id_linea_base != None:
                    listaItems.append(i)
        itemsSolicitud= SolicitudCambio.query.all()
        for li in listaItems:
            for its in itemsSolicitud:
                solicitud_items= Solicitud_Items.query.filter(Solicitud_Items.id_solicitud_cambio==its.id_solicitud_cambio).all()
                for si in solicitud_items:
                    if si.id_item==li.id_item and si.activo==True:
                        listaItems.remove(li)
                        
        solicitudItem= Solicitud_Items.query.filter(Solicitud_Items.id_solicitud_cambio==id_solicitud_cambio).all()
        
        for si in solicitudItem:
            item= Items.query.filter( Items.id_item== si.id_item).one()
            if (si.activo==True and item not in listaItems):
                listaItems.append(item)
        response = {"success" : True , "lista" : listaItems} 
        return listaItems  
    except Exception, e:
        print e
        response = {"success" : False , "msg" : "Ups... No se pudo traer la  lista de items!!"}
        return response 

    
@app.route('/solicitudcambio/listaritemssolicitud', methods=['GET', 'POST']) 
@jsonifiedview
def listarItemsSolicitudDeCambio():
    params = {'GET':request.args, 'POST':request.form}[request.method]
    response = {}
    if not ensureParams(params, ['id_solicitud_cambio']): 
        response = {"success" : False , "msg" : "Parametros Insuficientes!!"} 
        return response  
    try:
        
        id_solicitud_cambio = int(str(params['id_solicitud_cambio']))   
        
        solicitudItem= Solicitud_Items.query.filter(Solicitud_Items.id_solicitud_cambio== id_solicitud_cambio).all()
        listaItems=[]
        for si in solicitudItem:
            item= Items.query.filter( Items.id_item== si.id_item).one()
            if (si.activo==True and item not in listaItems):
                listaItems.append(item)
        response = {"success" : True , "lista" : listaItems} 
        return listaItems  
    except Exception, e:
        print e
        response = {"success" : False , "msg" : "Ups... No se pudo traer la  lista de items!!"}
        return response 
    
@app.route('/solicitudcambio/modificar', methods=['GET', 'POST']) 
@jsonifiedview
def modificarSolicitudDeCambio():
    '''
    Metodo que crea una solicitud de Cambio
    '''
    params = {'GET':request.args, 'POST':request.form}[request.method]
    response = {}
    if not ensureParams(params, ['id_usuario', 'observacion','id_items','id_solicitud_cambio']): 
        response = {"success" : False , "msg" : "Parametros Insuficientes!!"} 
        return response  
    
    try:
        
        id_usuario= int(str(params['id_usuario']))
        observacion= str(params['observacion'])
        id_items= simplejson.loads(params['id_items'])
        id_solicitud_cambio= int(str(params['id_solicitud_cambio']))
        
        solicitudItem= Solicitud_Items.query.filter(Solicitud_Items.id_solicitud_cambio==id_solicitud_cambio).all()
        
        for si in solicitudItem:
            db.session.delete(si)
            db.session.commit()
        
        solicitud_cambio= SolicitudCambio.query.filter(SolicitudCambio.id_solicitud_cambio==id_solicitud_cambio).one()
        db.session.delete(solicitud_cambio)
        db.session.commit()
        
        impacto_suma_total=0
        impacto_monetario_total=0
        descripcion_items=''
        descripcion_lb = ''
        
        now = datetime.datetime.now()
        usuario= Usuarios.query.filter(Usuarios.id_usuario==id_usuario).one()
        
        print id_items
        for id_item in id_items:
            item= Items.query.filter(Items.id_item== id_item).one()
            
            fasesProyecto=Fases.query.filter(Fases.id_fase==item.id_fase).one()
            
            proyectoPrueba=Proyectos.query.filter(Proyectos.id_proyecto==fasesProyecto.id_proyecto).one()
            
            if proyectoPrueba.estado==3:
                response = {"success" : False , "msg" : "NO se pueden realizar mas Solicitudes!!\n El proyecto ha finalizado!!"}
                return response
            
            descripcion_items= descripcion_items + item.nombre + ';'
            lineaBase = LineaBase.query.filter(LineaBase.id_linea_base == item.id_linea_base).one()
            descripcion_lb = descripcion_lb + str(lineaBase.numero) +';'
            
            try:
                
                impacto_total= int(str(calcularImpactoSolicitud(id_item)))
                impacto_monetario= int(str( calcularImpactoMonetarioSolicitud(id_item)))
                
                impacto_suma_total=impacto_suma_total + impacto_total
                impacto_monetario_total= impacto_monetario_total + impacto_monetario
                
              
            except Exception, e :
                response = {"success" : False , "msg" : "Ups! Hubo un error al intentar calcular el impacto del item. Intentelo mas tarde!!"}
                return response 
        
        for id_item in id_items:  
            verificar_solicitud= Solicitud_Items.query.filter(Solicitud_Items.id_item==id_item).all()
            for vs in verificar_solicitud:
                if vs.activo==True:
                    response ={"success" : False , "msg" : "Ups.!! Este item ya cuenta con una Solitud de Cambio ,favor, intentelo mas tarde!!"}
                    return response
                
        try:        
            solicitudCambio= SolicitudCambio(id_usuario,usuario.user_name,observacion, impacto_suma_total,impacto_monetario_total,'Pendiente de Envio',True,descripcion_items,0,0,0,now,False,descripcion_lb)
            db.session.add(solicitudCambio)
            db.session.commit()
        except Exception, e :
            response = {"success" : False , "msg" : "Ups! Hubo un error al intentar crear la solicitud. Intentelo mas tarde!!" + str(e)}
            return response
        
        try:
            for id_item in id_items:
                solicitud_item= Solicitud_Items(solicitudCambio.id_solicitud_cambio,id_item,True)
                db.session.add(solicitud_item)
                db.session.commit()
        except Exception, e :
            response = {"success" : False , "msg" : "Ups! Ups! Hubo un error al intentar crear la solicitud"}
            return response
        
        response ={"success" : True , "msg" : "Solicitud Creada Exitosamente!!"}
        return response
    except Exception, e:
        
        db.session.rollback()
        response ={"success" : False , "msg" : "Ups!! Hubo un error al intentar crear la solicitud de Cambio..." + str(e)}
        return response

